package br.com.almoxarifadoporttek.persistence;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import br.com.almoxarifadoporttek.model.Componente;
import br.com.almoxarifadoporttek.model.Propriedade;
import br.com.almoxarifadoporttek.model.Usuario;
import br.com.almoxarifadoporttek.util.HibernateUtil;

public class PropriedadeDAO implements IPropriedadeDAO
{

	@Override
	public List<Propriedade> list() 
	{
		Session session = null;
		
		try
		{
			session = HibernateUtil.getSession().openSession();
			Transaction t = session.beginTransaction();
			//List lista = session.createQuery("from Livro").list();		
			 
			List<Propriedade> lista = session.createCriteria(Propriedade.class).list();
			
			for(Propriedade prop : lista)
			{
				prop.getComponente().getId();
				prop.getComponente().getDescricao();
				prop.getComponente().getFabricante();
				prop.getComponente().getNome();
				prop.getComponente().getQuantidade();
				
				prop.getComponente().getLocal().getId();
				prop.getComponente().getLocal().getCodigo();
				
				
			}
			
			t.commit();
			return lista;
			
		}
		catch(Exception erro)
		{
			
			try
			{			
				if(session != null)
				{
					if(session.getTransaction().isActive())
						session.getTransaction().rollback();
				}
			
				
			}
			catch (Exception e) 
			{
				
			}
			
			return null;			
		}
		
		finally 
		{
			session.close();		
		}	
		
	}

	@Override
	public void save(Propriedade propriedade) 
	{
		Session session = null;
		
		try
		{
			session= HibernateUtil.getSession().openSession();
		
			Transaction t = session.beginTransaction();
			session.save(propriedade);
			t.commit();
			
		}catch(Exception erro){			
			try
			{			
				if(session != null)
				{
					if(session.getTransaction().isActive())
						session.getTransaction().rollback();				
				}				
			} catch (Exception e) {
				
			}		
		}		
		finally 
		{
			session.close();	
		}
		
	}

	@Override
	public void delete(Propriedade propriedade) 
	{
		Session session = null;
		try
		{
			session= HibernateUtil.getSession().openSession();
		
			Transaction t = session.beginTransaction();
			session.delete(propriedade);
			t.commit();
			
		}catch(Exception erro){			
			try
			{			
				if(session != null)
				{
					if(session.getTransaction().isActive())
						session.getTransaction().rollback();				
				}				
			} catch (Exception e) {
				
			}		
		}		
		finally 
		{
			session.close();	
		}
		
		
	}

	@Override
	public void update(Propriedade propriedade) 
	{
		Session session = null;
		
		try
		{
			session= HibernateUtil.getSession().openSession();
		
			Transaction t = session.beginTransaction();
			session.update(propriedade);
			t.commit();
			
		}catch(Exception erro){			
			try
			{			
				if(session != null)
				{
					if(session.getTransaction().isActive())
						session.getTransaction().rollback();				
				}				
			} catch (Exception e) {
				
			}		
		}		
		finally 
		{
			session.close();	
		}
		
		
	}

	@Override
	public List<Propriedade> listByUnidade(String unidade) 
	{
		Session session = null;
		
		try
		{
			session = HibernateUtil.getSession().openSession();
			Transaction t = session.beginTransaction();
			//List lista = session.createQuery("from Livro").list();
			Criteria criteria = session.createCriteria(Propriedade.class);
			criteria.add(Restrictions.eq("valor", unidade));
			List<Propriedade> lista =  criteria.list();
			
			for(Propriedade prop : lista)
			{
			
				prop.getComponente().getId();
				prop.getComponente().getDescricao();
				prop.getComponente().getFabricante();
				prop.getComponente().getNome();
				prop.getComponente().getQuantidade();
				
				prop.getComponente().getLocal().getId();
				prop.getComponente().getLocal().getCodigo();
				
				
			}
			
			t.commit();
			return lista;
			
		}
		catch(Exception erro)
		{
			
			try
			{			
				if(session != null)
				{
					if(session.getTransaction().isActive())
						session.getTransaction().rollback();
				}
			
				
			}
			catch (Exception e) 
			{
				
			}
			
			return null;			
		}
		
		finally 
		{
			session.close();		
		}	
	}

	@Override
	public List<Propriedade> listByComponente(Componente componente) 
	{
		Session session = null;
		
		try
		{
			session = HibernateUtil.getSession().openSession();
			Transaction t = session.beginTransaction();
			//List lista = session.createQuery("from Livro").list();
			Criteria criteria = session.createCriteria(Propriedade.class);
			criteria.add(Restrictions.eq("componente", componente));
			List<Propriedade> lista =  criteria.list();
			
			
			for(Propriedade prop : lista)
			{
			
				prop.getComponente().getId();
				prop.getComponente().getDescricao();
				prop.getComponente().getFabricante();
				prop.getComponente().getNome();
				prop.getComponente().getQuantidade();
				
				prop.getComponente().getLocal().getId();
				prop.getComponente().getLocal().getCodigo();
				
				
			}
			
			t.commit();
			return lista;
			
		}
		catch(Exception erro)
		{
			
			try
			{			
				if(session != null)
				{
					if(session.getTransaction().isActive())
						session.getTransaction().rollback();
				}
			
				
			}
			catch (Exception e) 
			{
				
			}
			
			return null;			
		}
		
		finally 
		{
			session.close();		
		}	
	}

	@Override
	public List<Propriedade> listByNomeValor(String nome, String valor) {
		
		Session session = null;
		
		try
		{
			session = HibernateUtil.getSession().openSession();
			Transaction t = session.beginTransaction();
			Criteria criteria = session.createCriteria(Propriedade.class);
			criteria.add(Restrictions.eq("nome", nome));
			criteria.add(Restrictions.eq("valor", valor));
			List<Propriedade> lista =  criteria.list();
			
			for(Propriedade prop : lista)
			{
				prop.getComponente().getId();
				prop.getComponente().getDescricao();
				prop.getComponente().getFabricante();
				prop.getComponente().getNome();
				prop.getComponente().getQuantidade();
				
				prop.getComponente().getLocal().getId();
				prop.getComponente().getLocal().getCodigo();
				
				
			}
			
			t.commit();
			return lista;
		}
	
		catch(Exception erro)
		{
			
			try
			{			
				if(session != null)
				{
					if(session.getTransaction().isActive())
						session.getTransaction().rollback();
				}
			
				
			}
			catch (Exception e) 
			{
				
			}
			
			return null;			
		}
		
		finally 
		{
			session.close();		
		}
	}

}
